﻿#ifndef __AF_APP_H__
#define __AF_APP_H__

#include "AF_Define.h"

namespace AF
{
	class Application;
}
typedef AF::Application			AF_CApplication;

#include "AF_Platform.h"
#include "AF_Event.h"
#include "AF_Window.h"

/// 唯一应用程序运行实例指针
#define	AF_pTHEAPP			AF_CApplication::TheApp
/// 当前使用窗口
#define	AF_pTHEWINSOW			AF_CApplication::TheApp->GetWindow()
/// 当前使用平台指针 
#define AF_pTHEPLATFORM			AF_CApplication::ThePlatform

// #define AF_FPS_DEFAULT		20

namespace AF
{
	/**
 	 *  @addtogroup Frame
	 *  @{
	 */

	/// 应用程序基类
	class _ABSTRACT Application
	{
		friend class Window; // 用于可调用更新计时器

	public:
		/// 唯一应用程序运行实例指针
		static Application*	TheApp;
		/// 当前使用平台指针
		static Platform*	ThePlatform;
		/// 清除所有内存
		static void		DeleteAllMemory();

	public:
		Application();
		virtual ~Application();

	public:
		/// 初始化应用程序
		/**
		 *  @returns
		 *	返回是否初始化程序成功。
		 */
		bool			InitApp();

		/// 运行应用程序
		/**
		 *  @returns
		 *	返回程序运行结束的返回值。
		 */
		int			RunApp();

		/// 退出应用程序
		/**
		 *  @param 
		 *	isCommand 是否强行退出。默认为否(false)。
		 *  @returns
		 *	返回是否允许程序退出。
		 */
		bool			QuitApp(bool isCommand = false);

		/// 更新应用程序
		void			UpdateApp();

	public:
		/// 获得承载程序运行的窗口指针
		Window*			GetWindow();

	public:
		/// 创建应用程序默认资源包
		virtual Package*	CreateDefaultPackage(_STRING& _OUT strPackageKind)
					{return NULL;}

	protected:
		/// 获得图像引擎平台
		/**
		 *	纯虚函数。
		 *  @returns
		 *	返回图像引擎平台指针。
		 */
		virtual AF_CPlatform*	GetUsePlatform() = 0;
		
		virtual AF_CWindow*	GetUseWindow()
					{return m_pMainWindow;}

	protected:
		/// 当初始化程序时引发的事件
		/**
		 *	纯虚函数。
		 *  @returns
		 *	返回初始化是否成功。
		 */
		virtual Scene*		OnInitApp(_OUT AF_SCreateWindow& cw) = 0;

		/// 当开始程序时引发的事件
		/**
		 *	虚函数。
		 *  @returns
		 *	返回是否运行程序。
		 */
		virtual bool		OnStartApp()
					{return true;}

		/// 当完成程序时引发的事件
		/**
		 *	虚函数。
		 */
		virtual void		OnFinishApp()
					{return;}

		/// 当结束程序时引发的事件
		/**
		 *	虚函数。
		 *  @returns
		 *	返回是否可以结束程序。
		 */
		virtual bool		OnExitApp(bool bIsCommand)
					{return true;}

		/// 当退出程序时引发的事件
		/**
		 *	虚函数。
		 */
		virtual int		OnQuitApp()
					{return 0;}

		/// 当获得系统事件时引发的事件
		/**
		 *	虚函数。
		 */
		virtual bool		OnGetEvent(Event& event)
					{return true;}

		/// 当更新应用程序时引发的事件
		/**
		 *	虚函数。
		 */
		virtual void		OnUpdateApp()
					{return;}

	private:
		void			UpdateTimers();
		void			UpdateExactTimers();

	protected:
		/// 程序运行窗口指针
		Window*			m_pMainWindow;
		/// 程序主场景指针
		Scene*			m_pMainScene;
		/// 程序退出标示
		bool			m_isQuitApp;
	};

	/** @} */

}

#endif